import { Mapping } from "../domain/IndexBase";

export type { Mapping };

/**
 * 字段
 */
export interface Field {
  /**
   * 显示名称
   */
  label: string;

  /**
   * 字段名称
   */
  name: string;

  /**
   * 数据索引，仅用于确保唯一
   */
  dataIndex: string;

  /**
   * 字段类型
   */
  type: string;
}

export type Dynamic = "true" | "false" | "strict";

export type Type = "text" | "long" | "date" | "keyword" | "short" | "integer" | "nested";

export interface Keyword {
  ignore_above: number;

  /**
   * 字段类型
   */
  type: string;
}

export interface SettingInfo {
  /**
   * 分片数
   */
  number_of_shards: number;

  /**
   * 副本数
   */
  number_of_replicas: number;

  /**
   * 创建日期，时间戳
   */
  creation_date: string;

  /**
   * UUID
   */
  uuid: string;

  /**
   * 版本
   */
  version: {
    created: string;
  };

  /**
   * 名字
   */
  provided_name: string;
}

export interface IndexInfo {
  /**
   * 状态
   */
  state: string;

  /**
   * 别名
   */
  aliases: Array<string>;

  /**
   * 映射
   */
  mappings: Record<string, Mapping> | Mapping;

  /**
   * 设置
   */
  settings: SettingInfo;
}

export interface AllocationID {
  id: string;
}

export interface RecoverySource {
  type: string;
}

export interface UnassignedInfo {
  reason: string;
  at: Date;
  delayed: boolean;
  allocation_status: string;
}

export interface Shard {
  state: string;
  primary: boolean;
  node: string;
  relocating_node: null;
  shard: number;
  index: string;
  /**
   * state === 'STARTED' 时有效
   */
  allocation_id?: AllocationID;
  /**
   * state === 'UNASSIGNED' 时有效
   */
  recovery_source?: RecoverySource;
  /**
   * state === 'UNASSIGNED' 时有效
   */
  unassigned_info?: UnassignedInfo;
}

/**
 * 主页索引遍历
 */
export interface IndexItem {
  /**
   * 索引名称
   */
  name: string;

  /**
   * 别名
   */
  alias: Array<string>;

  /**
   * 字段
   */
  fields: Array<Field>;

  /**
   * 为了兼容v6版本，一个索引可以有多个类型，v7之后只会有_doc
   */
  types: Array<string>;

  /**
   * 索引元信息，仅用于展示
   */
  indexInfo: IndexInfo;

  // ------------------------------------------- 渲染后 -------------------------------------------

  /**
   * 索引大小，美化后的
   */
  size: string;

  /**
   * 索引大小，原始数据
   */
  original_size: number;

  /**
   * 文档数
   */
  doc_count: string;

  /**
   * 原始文档数
   */
  original_doc_count: number;

  /**
   * 状态
   */
  state?: string;

  /**
   * 分片
   */
  shards: Record<string, Array<Shard>>;
}

export interface ClusterNode {
  name: string;
}

export interface IndexItemResult {
  masterNode: string;
  /**
   * 节点
   * 节点ID => 节点
   */
  nodes: Record<string, ClusterNode>;
  // 索引
  indices: Array<IndexItem>;
  // 解析错误的索引名称
  errorIndexKeys: Array<string>;
}
